package guhong.play.commandsystem.job.tool.ai;

import cn.hutool.core.util.StrUtil;
import guhong.play.commandsystem.dto.entity.Command;
import guhong.play.commandsystem.dto.entity.CommandConfig;
import guhong.play.commandsystem.job.CommandJob;
import guhong.play.commandsystem.util.print.PrintUtil;
import lombok.Data;

import java.util.Map;

/**
 * @author : 李双凯
 * @date : 2019-11-20 22:32
 **/
@Data
public class AiCommandJob implements CommandJob {

    @Override
    public CommandConfig getCommandConfig() {
        CommandConfig commandConfig = new CommandConfig("ai");
        commandConfig.setGroup("tool");
        commandConfig.setDescription("ai 工具");
        Map<String, Boolean> paramConfig = commandConfig.getParamConfig();
        // 开启新对话
        paramConfig.put("new", false);
        // 停止输出
        paramConfig.put("stop", false);

        // change:切换至一个的Prompt
        // 使用name切换，没有就查看当前的prompt
        paramConfig.put("-cp", true);
        // save:保存并切换到这个Prompt: save prompt。
        // 格式为：name:prompt
        paramConfig.put("-scp", true);
        // remove:删除一个Prompt
        paramConfig.put("-rp", true);
        // query: 列出所有Prompt和当前的Prompt
        paramConfig.put("-qp", false);
        // exit：退出当前Prompt
        paramConfig.put("-ep", false);

        // 使用的ai模型
        paramConfig.put("-m", true);
        // top_p
        paramConfig.put("-top", true);

        return commandConfig;
    }

    @Override
    public void run(Command command) {
        String newOpenSession = command.getParamValue("new");
        if (newOpenSession != null) {
            AiCommandManager.openNewSession();
            PrintUtil.println("========已开启新会话========\n");
        }
        String stopCommand = command.getParamValue("stop");
        if (stopCommand != null) {
            AiCommandManager.stopOutput.set(true);
            return;
        }

        String cpCommand = command.getParamValue("-cp");
        if (cpCommand != null) {
            AiCommandManager.changePrompt(cpCommand);
        }

        String scpCommand = command.getParamValue("-scp");
        if (StrUtil.isNotBlank(scpCommand)) {
            AiCommandManager.saveAndChangePrompt(scpCommand);
        }

        String rpCommand = command.getParamValue("-rp");
        if (StrUtil.isNotBlank(rpCommand)) {
            AiCommandManager.removePrompt(rpCommand);
        }

        String qpCommand = command.getParamValue("-qp");
        if (qpCommand != null) {
            AiCommandManager.printPromptList();
        }

        String epCommand = command.getParamValue("-ep");
        if (epCommand != null) {
            AiCommandManager.exitPrompt();
        }

        String messageStr = command.getFirstValue();
        if (StrUtil.isNotBlank(messageStr)) {
            // 刷新配置
            flushAiConfig(command.getParams());
            // 开启输出
            AiCommandManager.stopOutput.set(false);
            // 获取回答
            AiCommandManager.getAnswer(messageStr);
        }
    }

    private void flushAiConfig(Map<String, String> params) {
        String model = params.get("-m");
        if (StrUtil.isNotBlank(model)) {
            AiCommandManager.aiConfig.setMode(model);
        }
        String top = params.get("-top");
        if (StrUtil.isNotBlank(top)) {
            // 如果topP大于1，或小于0，则报错
            double topP = Double.parseDouble(top);
            if (topP > 1 || topP < 0) {
                PrintUtil.printLnError("topP的值必须在0-1之间");
            }
            AiCommandManager.aiConfig.setTopP(topP);
        }
    }

    @Override
    public void init() {
        AiCommandManager.init();
    }

    @Override
    public void windowClosing() {
        AiCommandManager.sync();
    }
}
